/**
 * 缓存工具类
 * 用于处理数据缓存和持久化
 */

// 默认缓存时间（毫秒）
const DEFAULT_CACHE_TIME = 1000 * 60 * 60 * 24; // 24小时

/**
 * 设置缓存
 * @param {string} key - 缓存键
 * @param {any} value - 缓存值
 * @param {number} expire - 过期时间（毫秒）
 */
export const setCache = (key, value, expire = DEFAULT_CACHE_TIME) => {
  const data = {
    value,
    expire: expire !== null ? new Date().getTime() + expire : null
  };
  uni.setStorageSync(key, JSON.stringify(data));
};

/**
 * 获取缓存
 * @param {string} key - 缓存键
 * @param {any} def - 默认值（缓存不存在或已过期时返回）
 * @returns {any} - 缓存值或默认值
 */
export const getCache = (key, def = null) => {
  const data = uni.getStorageSync(key);
  if (!data) return def;
  
  try {
    const cache = JSON.parse(data);
    const { value, expire } = cache;
    
    // 判断是否过期
    if (expire === null || expire >= new Date().getTime()) {
      return value;
    }
    
    // 已过期，删除缓存
    removeCache(key);
    return def;
  } catch (e) {
    return def;
  }
};

/**
 * 移除缓存
 * @param {string} key - 缓存键
 */
export const removeCache = (key) => {
  uni.removeStorageSync(key);
};

/**
 * 清空所有缓存
 */
export const clearCache = () => {
  uni.clearStorageSync();
};

/**
 * 设置本地数据（永久存储）
 * @param {string} key - 存储键
 * @param {any} value - 存储值
 */
export const setLocalData = (key, value) => {
  uni.setStorageSync(key, JSON.stringify(value));
};

/**
 * 获取本地数据
 * @param {string} key - 存储键
 * @param {any} def - 默认值
 * @returns {any} - 存储值或默认值
 */
export const getLocalData = (key, def = null) => {
  const data = uni.getStorageSync(key);
  if (!data) return def;
  
  try {
    return JSON.parse(data);
  } catch (e) {
    return data || def;
  }
};

/**
 * 移除本地数据
 * @param {string} key - 存储键
 */
export const removeLocalData = (key) => {
  uni.removeStorageSync(key);
};

/**
 * 缓存API请求数据
 * @param {string} key - 缓存键
 * @param {Function} request - 请求函数
 * @param {number} expire - 过期时间（毫秒）
 * @param {boolean} forceUpdate - 是否强制更新
 * @returns {Promise} - 请求结果Promise
 */
export const cacheRequest = async (key, request, expire = DEFAULT_CACHE_TIME, forceUpdate = false) => {
  // 如果强制更新，则直接发起请求
  if (forceUpdate) {
    try {
      const data = await request();
      setCache(key, data, expire);
      return data;
    } catch (e) {
      return Promise.reject(e);
    }
  }
  
  // 尝试从缓存获取
  const cached = getCache(key);
  if (cached !== null) {
    return cached;
  }
  
  // 缓存不存在，发起请求
  try {
    const data = await request();
    setCache(key, data, expire);
    return data;
  } catch (e) {
    return Promise.reject(e);
  }
};